package models

import (
	"encoding/json"
	"time"

	"database/sql/driver"

	"gorm.io/gorm"
)

// 用户偏好设置
type UserPreference struct {
	gorm.Model
	UserID         uint       `gorm:"not null;index"`          // 用户ID
	User           User       `gorm:"foreignKey:UserID"`       // 用户关联
	FavCategories  StringList `gorm:"type:json;not null"`      // 喜爱的菜系
	FavTags        StringList `gorm:"type:json;not null"`      // 喜爱的口味标签
	SpicyLevel     int        `gorm:"not null;default:0"`      // 辣度偏好
	DietaryNeeds   StringList `gorm:"type:json;not null"`      // 饮食需求
	Allergies      StringList `gorm:"type:json;not null"`      // 过敏源
	DislikedDishes UintList   `gorm:"type:json;not null"`      // 不喜欢的菜品ID
}

// StringList 是字符串数组的自定义类型
type StringList []string

// Value 实现 driver.Valuer 接口
func (l StringList) Value() (driver.Value, error) {
	return json.Marshal(l)
}

// Scan 实现 sql.Scanner 接口
func (l *StringList) Scan(value interface{}) error {
	if value == nil {
		*l = StringList{}
		return nil
	}
	return json.Unmarshal(value.([]byte), l)
}

// UintList 是 uint 数组的自定义类型
type UintList []uint

// Value 实现 driver.Valuer 接口
func (l UintList) Value() (driver.Value, error) {
	return json.Marshal(l)
}

// Scan 实现 sql.Scanner 接口
func (l *UintList) Scan(value interface{}) error {
	if value == nil {
		*l = UintList{}
		return nil
	}
	return json.Unmarshal(value.([]byte), l)
}

// 用户收藏的菜品
type UserFavorite struct {
	gorm.Model
	UserID    uint   `gorm:"not null;index"`    // 用户ID
	User      User   `gorm:"foreignKey:UserID"` // 用户关联
	DishID    uint   `gorm:"not null;index"`    // 菜品ID
	Dish      Dish   `gorm:"foreignKey:DishID"` // 菜品关联
	Note      string // 收藏备注
	FromOrder uint   // 来自哪个订单
}

// 用户浏览历史
type BrowsingHistory struct {
	gorm.Model
	UserID     uint      `gorm:"not null;index"`     // 用户ID
	User       User      `gorm:"foreignKey:UserID"`  // 用户关联
	DishID     uint      `gorm:"not null;index"`     // 菜品ID
	Dish       Dish      `gorm:"foreignKey:DishID"`  // 菜品关联
	ViewCount  int       `gorm:"not null;default:1"` // 浏览次数
	LastViewed time.Time `gorm:"not null"`           // 最后浏览时间
}

// 用户订单统计
type OrderStats struct {
	gorm.Model
	UserID            uint       `gorm:"not null;index"`         // 用户ID
	User              User       `gorm:"foreignKey:UserID"`      // 用户关联
	TotalOrders       int        `gorm:"not null;default:0"`     // 总订单数
	TotalAmount       float64    `gorm:"not null;default:0"`     // 总消费金额
	FavDishes         UintList   `gorm:"type:json;not null"`     // 常点菜品ID（按频率排序）
	FavCategories     StringList `gorm:"type:json;not null"`     // 常点菜系（按频率排序）
	FavStores         UintList   `gorm:"type:json;not null"`     // 常光顾门店ID
	AvgOrderAmount    float64    `gorm:"not null;default:0"`     // 平均订单金额
	PreferredMealTime string     `gorm:"not null;default:lunch"` // 常用餐时段
	LastOrderTime     *time.Time // 最后下单时间
}
